/*
 * @lc app=leetcode.cn id=3 lang=cpp
 * @lcpr version=30204
 *
 * [3] 无重复字符的最长子串
 */

// @lcpr-template-start
using namespace std;
#include <algorithm>
#include <array>
#include <bitset>
#include <climits>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
// @lcpr-template-end
// @lc code=start
class Solution
{
public:
    int lengthOfLongestSubstring(string s)
    {
        // 法1：
        // 滑动窗口 出现重复的就将前面的删除
        unordered_map<char, int> hashmap;
        int length = s.size();
        int left = 0;
        int resmax = 0;
        for (int right = 0; right < length; ++right)
        {
            hashmap[s[right]]++;
            while (hashmap[s[right]] > 1)
            {
                hashmap[s[left++]]--;
            }
            resmax = max(resmax, right - left + 1);
        }

        return resmax;

        // 法2：可以利用map直接跳转到对应得重复字符处，减少时间
        // unordered_map<char, int> hashmap;
        // int length = s.size();
        // int left = 0;
        // int resmax = 0;
        // for (int i = 0; i < length; ++i)
        // {
        //     left = max(left, hashmap[s[i]]);
        //     hashmap[s[i]] = i + 1;
        //     resmax = max(resmax, i - left + 1);
        // }
        // return resmax;
    }
};
// @lc code=end

/*
// @lcpr case=start
// "abcabcbb"\n
// @lcpr case=end

// @lcpr case=start
// "bbbbb"\n
// @lcpr case=end

// @lcpr case=start
// "pwwkew"\n
// @lcpr case=end

 */
